/**
 ****************************************
 * @file wifi_app.h
 * @author: AnRui
 * @version 0.1
 * @date  : 2025-08-11
 * @copyright Copyright (c) 2025
 * @desc: 不采用死等的方式而是采用状态机 发送与接收数据
 *         向wifi模块发送命令 不同的命令 返回的结果不同 返回数据的间隔时间也不同
 *         一条一条发送命令 在当前命令的返回之前 不可以发送另一条命令
 *         AT命令的回显问题: 发送一个命令 默认会把命令以及响应数据都返回来
 *                          可以通过发送AT命令:         关闭回显
 *
 *       乐鑫AT命令:
 *          地址: https://docs.espressif.com/projects/esp-at/zh_CN/latest/esp32c2/AT_Command_Set/index.html#
 *          注意：
 *              1. AT 命令的默认波特率为 115200。
 *              2. 每条 AT 命令的长度不应超过 256 字节。
 *              3. AT 命令以新行 (CR-LF) 结束，所以串口工具应设置为“新行模式”。
 *                      CR 指回车符（Carriage Return），ASCII 码为 0x0D，通常表示为 \r；
 *                      LF 指换行符（Line Feed），ASCII 码为 0x0A，通常表示为 \n。
 *              4.需要转义的字符
 *                 特殊字符需作转义处理，当前需要转义的字符有 ,、"、\。
 *                 \\：转义反斜杠。
 *                 \,：转义逗号，分隔参数的逗号无需转义。
 *                 \"：转义双引号，表示字符串参数的双引号无需转义。
 *                 \<any>：转义 <any> 字符，即只使用 <any> 字符，不使用反斜杠。
 *                 只有,出现在""内部的时候 才需要前面加上\
 *              5. 乐鑫wifi模块需要  ,只支持2.4G频段
 *         wifi硬复位后 会发送ready 所以硬复位后 要间隔一点时间 如果复位玩立即发送命令 可能会导致第一条命令失败
 *         待解决的问题: 在发送"AT\r\n" 命令后 会触发两次空闲中断 但第二次空闲中断 没有数据接收 其他命令不会出现这种情况
 *                      目前没有找到问题的原因
 *              WIFI模组联网时功耗较高 不要使用jlink供电
 *
 *
 *
 *
 *
 * ***************************************
 */
#ifndef __WIFI_APP_H__
#define __WIFI_APP_H__
#include "gd32f30x.h"
#include <stdio.h>
#include "wifi_drv.h"
#include "delay.h"

typedef enum {
    WIFI_CMD_SEND = 0, // 命令发送状态
    WIFI_CMD_WAIT,   // 等待命令返回
    WIFI_CMD_RETRY,  // 命令发送重试状态
    WIFI_CMD_FAIL,   // 命令发送失败 没有在规定时间内发送响应或响应不正确
    WIFI_CMD_SUCCESS, // 命令发送成功并且在规定时间内接收到正确的响应
} WifiCmdState_e;    // 命令的执行状态

typedef struct {
    // 要发送的AT命令
    char* cmd;
    // 期望的应答数据，默认处理匹配到该字符串认为命令执行成功
    char* rsp;
    // 得到应答的超时时间，达到超时时间为执行失败，单位ms
    uint32_t timeoutMs;
    // 重试次数
    uint32_t maxRetryTimes;
} AtCmdInfo_s;


#define WIFI_HARD_RESET_TIMES 1         // 硬件复位次数
#define WIFI_SEND_MESSAGE_PERIOD 3000   // 发送消息的周期
// 命令序号
#define CMD_IDX_CLOSE_ECHO 0  // 关闭回显
#define CMD_IDX_SET_STA 1     // 设置STA模式
#define CMD_IDX_CONN_AP 2     // 连接热点
#define CMD_IDX_MQTT_CONF 3     // 配置MQTT
#define CMD_IDX_CONN_CONF   4     // MQTT连接配置的命令索引
#define CMD_IDX_MQTT_BROKER 5     // 连接MQTT BROKER配置MQTT
#define CMD_IDX_PUB_MESSAGE 6     // 发布消息的命令索引
#define CMD_IDX_CLEAN_INFO  7     // 清理配置消息命令索引


typedef enum {
    WIFI_AT_MODULE_CHECK_1_STATUS = 0,//AT通信检查-关闭回显
    WIFI_AT_MODULE_CHECK_2_STATUS,//AT通信检查-设置为客户端模式
    WIFI_HOT_POINT_CONN_STATUS,//连接热点
    WIFI_MQTT_CONFIG_STATUS,//配置MQTT
    WIFI_MQTT_CONN_BROKER_STATUS,//连接MQTT BROKER
    WIFI_PUB_MESSAGE_STATUS,//发布消息
    WIFI_RECONNECT_CLEAN_INFO_STATUS, // mqtt重连第一步:清理信息
    WIFI__MQTT_CONN_CONF_STATUS, // mqt连接配置
    WIFI_HARD_RESET_STATUS, //硬件复位
    WIFI_MODULE_ERROR_STATUS, //模块错误
} WifiWorkState_t;

void WifiNetWorkTask(void);

#endif
